package com.jrx.anytxn.param.service.product;

import com.jrx.anytxn.common.exception.TxnBizException;
import com.jrx.anytxn.common.exception.TxnException;
import com.jrx.anytxn.i18n.response.TxnPage;
import com.jrx.anytxn.param.dto.product.ProductTableReq;
import com.jrx.anytxn.param.dto.product.ProductTableRes;
import com.jrx.anytxn.param.entity.PrProductFund;
import com.jrx.anytxn.param.entity.PrProductTable;

import java.util.List;

/**
 * 产品表 业务接口
 *
 * @author 黄秋平
 * @date 2020-5-26 15:27:18
 */
public interface IProductTableService {

    /**
     * 根据租户ID分页查询产品参数信息
     * @param pageNum
     * @param pageSize
     * @param tenantId
     * @return
     * @throws TxnException
     */
    TxnPage<ProductTableRes> findAllPageByTenId(Integer pageNum, Integer pageSize, String tenantId) throws TxnException;

    /**
     * 添加产品参数
     * @param productTableReq
     * @return
     * @throws TxnException
     */
    ProductTableRes addProductTable(ProductTableReq productTableReq) throws TxnException;

    /**
     * 更新产品参数
     * @param productTableReq
     * @return
     * @throws TxnException
     */
    ProductTableRes modifyProductTable(ProductTableReq productTableReq) throws TxnException;

    /**
     * 通过租户ID和产品ID删除产品参数
     * @param tenantId
     * @param productId
     * @return
     * @throws TxnException
     */
    Boolean removeByTenIdAndProId(String tenantId, String productId) throws TxnException;

    /**
     * 根据租户ID和产品ID查询产品表信息
     * @param tenantId
     * @param productId
     * @return
     * @throws TxnException
     */
    ProductTableRes findByTenIdAndProId(String tenantId, String productId) throws TxnException;

    /**
     * 获取所有产品列表
     * @param tenantId
     * @return
     */
    List<ProductTableRes> findAllProductByTenId(String tenantId);

    /**
     * 根据机构ID和租户ID获取有效产品信息列表
     * @param orgId
     * @param tenantId
     * @return
     * @throws TxnException
     */
    List<ProductTableRes> findProductByOrgIdAndTenId(String orgId, String tenantId) throws TxnException;

    /**
     * 根据产品ID与机构ID获取
     * @param productId
     * @param orgId
     * @param tenantId
     * @return
     * @throws TxnBizException
     */
    PrProductTable findProByProIdAndOrgId(String productId, String orgId, String tenantId) throws TxnBizException;

    /**
     * 获取所有产品
     * @param tableStatus
     * @return
     */
    List<PrProductTable> findAllForBatch(String tableStatus);

    /**
     * 获取需要生成对账文件产品
     */
    List<PrProductTable> findAllVerifyForBatch(String tableStatus,String verifyFileFlag);

    /**
     * 根据产品id获取该产品下的资金源
     *
     * @param productId 产品id
     * @param tenantId 租户id
     * @return List<PrProductFund>
     */
    List<PrProductFund> findFundByProductId(String productId, String tenantId) throws TxnBizException;

    /**
     * 根据产品类型，渠道通过规则匹配产品
     * @param productType
     * @param tenantId
     * @param channel
     * @param orgId
     * @return
     * @throws TxnBizException
     */
    PrProductTable getPrProductTableByRule(String productType,String tenantId,String channel,String orgId) throws TxnBizException;
}
